8.2 简单的TCP示例

TCP在我们的实际开发中也是必不可少的东西,我们的大部分业务都需要使用TCP实现。

比如聊天软件、聊天室等,在Go语言中使用TCP也比较简单,我们接下来直接以代码示例进行说明。

示例主要分为两方面,一个是客户端,一个是服务端。

本节代码存放目录为 lesson24

  • 服务端
server.go

func handleConnection(conn net.Conn) {
    defer conn.Close()

    fmt.Printf("handleConnection, remote-> %s\n", conn.RemoteAddr().String())
    for {
        data, err := bufio.NewReader(conn).ReadString('\n')
        if err != nil {
            if err == io.EOF {
                fmt.Printf("断开连接\n")
                break
            }
            fmt.Printf("err-> %v", err)
        }
        fmt.Printf("接收数据: %s", data)
    }
}

func main() {
    l, err := net.Listen("tcp", "127.0.0.0:8088")
    if err != nil {
        fmt.Printf("err-> %v\n", err)
        return
    }
    defer l.Close()
    for {
        conn, err := l.Accept()
        if err != nil {
            fmt.Printf("err-> %v", err)
            continue
        }
        go handleConnection(conn)
    }
}

在上面的代码中,我们首先通过net.Listen创建了TCP服务器,之后我们通过for一直不断的监听来自客户端的连接。

当有新的客户端进行连接时,我们开启了一个协程handleConnection来读取来自客户端的连接。

  • 客户端
client.go

func main() {
    conn, err := net.Dial("tcp", "127.0.0.1:8088")
    if err != nil {
        fmt.Printf("err-> %v\n", err)
        return
    }
    defer conn.Close()

    for {
        data := fmt.Sprintf("%s\n", time.Now().Format("2006-01-02 15:04:05"))
        fmt.Printf(data)
        fmt.Fprintf(conn, data)
        time.Sleep(time.Duration(1) * time.Second)
    }
}

在客户端代码中,我们通过net.DialTCP服务器发起了连接,之后通过for循环每隔一秒向服务器发送当前时间数据。

  • 运行

首先我们需要将server.go运行起来,之后运行client.go

server.go运行输出如下:

handleConnection, remote-> 127.0.0.1:49192
接收数据: 2024-08-20 14:40:45
接收数据: 2024-08-20 14:40:46
接收数据: 2024-08-20 14:40:47
接收数据: 2024-08-20 14:40:48

client.go运行输出如下:

2024-08-20 14:40:45
2024-08-20 14:40:46
2024-08-20 14:40:47
2024-08-20 14:40:48

TCP是比较常用且复杂的东西,在实际使用的时候需要考虑的东西比较多。

例如客户端的连接如何管理、通信协议如何制定、如何保持连接等,这是一整套的内容,如果感兴趣的话可以看一下 plex ,这是一个基础的TCP应用案例。

results matching ""

    No results matching ""